package reflect;

import java.lang.reflect.Method;

/**
 * 反射机制：
 *
 * 类对象
 * JVM使用一个类时首先会读取该类的字节码文件，然后将其保存在一个Class实例中，这个Class
 * 实例称为“类对象”。每个被加载的类都有且只有一个Class的实例
 *
 * 反射的第一步就是获取要操作的类的类对象
 */
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        //获取类对象的方式
        //1:类名.class
        Class cls = String.class; //引用类型获取类对象
        Class cls1 = int.class; //基本类型也可以获取类对象

        //2:Class.forName("类名") 根据类的完全限定名获取类对象(包名。类名)
        Class cls2 = Class.forName("java.lang.String");
        Class cls3 = Class.forName("java.util.ArrayList");


        //3:对象.getClass()
        //4.类加载器ClassLoader

        /*
        通过类对象可以了解对应类的相关信息
         */
        //获取类的完全限定名
        String name = cls.getName();
        System.out.println(name);
        //仅获取类的名字
        name  = cls.getSimpleName();
        System.out.println(name);

        /*
        Method是凡是对象之一，他的每一个实例仅用于表达一个方法
        通过Method实例可以获取方法相关信息(方法名，参数列表，返回值类型)

        类对象提供的方法
        Method[] getMethods()
        获取当前类及其父类的所有public方法
         */
        Method[] methods = cls.getMethods();
        System.out.println(name+"一共有"+methods.length+"个方法");
        for (Method method : methods){
            System.out.println(method.getName());
        }
    }
}
